package com.forum.message.service;

import com.forum.common.event.MessageEvent;
import com.forum.message.model.dto.MessageDTO;
import com.forum.message.model.entity.Message;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * 消息服务接口
 */
public interface MessageService {
    
    /**
     * 处理消息事件
     * 
     * @param event 消息事件
     * @return 保存的消息
     */
    Message processMessageEvent(MessageEvent event);
    
    /**
     * 保存消息
     * 
     * @param message 消息实体
     * @return 保存后的消息
     */
    Message saveMessage(Message message);
    
    /**
     * 获取用户的消息列表
     * 
     * @param userId 用户ID
     * @param isRead 是否已读（null表示全部）
     * @param type 消息类型（null表示全部）
     * @param pageable 分页参数
     * @return 消息分页结果
     */
    Page<MessageDTO> getUserMessages(Long userId, Boolean isRead, String type, Pageable pageable);
    
    /**
     * 标记消息为已读
     * 
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 已更新的消息
     */
    MessageDTO markAsRead(Long messageId, Long userId);
    
    /**
     * 标记用户所有消息为已读
     * 
     * @param userId 用户ID
     * @param type 消息类型（null表示全部）
     * @return 更新的消息数量
     */
    int markAllAsRead(Long userId, String type);
    
    /**
     * 获取用户未读消息数量
     * 
     * @param userId 用户ID
     * @param type 消息类型（null表示全部）
     * @return 未读消息数量
     */
    long getUnreadCount(Long userId, String type);
    
    /**
     * 删除消息
     * 
     * @param messageId 消息ID
     * @param userId 用户ID
     */
    void deleteMessage(Long messageId, Long userId);
    
    /**
     * 删除用户所有消息
     * 
     * @param userId 用户ID
     * @return 删除的消息数量
     */
    int deleteAllMessages(Long userId);
    
    /**
     * 将消息实体转换为DTO
     * 
     * @param message 消息实体
     * @return 消息DTO
     */
    MessageDTO convertToDTO(Message message);
} 